package ru.averta.notes.service.search;

import org.springframework.util.StringUtils;

import java.util.Arrays;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;

/**
 * <code>SubjectCriteriaExceptionBean</code>
 *
 * Используется для поиска исключений относительно SubjectCriteriaSimpleBean
 *
 * @author fedor.belov (fedor.belov@mail.ru)
 *         Date: 23.09.11 14:40
 */
public class SubjectCriteriaExceptionBean implements SubjectCriteriaBean {

    private SubjectCriteriaSimpleBean simpleBean;
    private List<String> exceptWords;
    private List<String> exceptTags;

    public SubjectCriteriaExceptionBean(SubjectCriteriaSimpleBean simpleBean) {
        this.simpleBean = simpleBean;
    }

    /**
     * Исключает из первоначального критерия поиск слов(а) word
     * @param word
     * @return
     */
    public SubjectCriteriaExceptionBean setExceptWords(String... word) {
        exceptWords = Arrays.asList(word);
        return this;
    }

    /**
     * Исключает из первоначального критерия поиск по тегу(ам) tag
     * @param tag
     * @return
     */
    public SubjectCriteriaExceptionBean setExceptTags(String... tag) {
        exceptTags = Arrays.asList(tag);
        return this;
    }

    @Override
    public String getFullText() {
        if (exceptWords == null || exceptWords.isEmpty()) {
            return simpleBean.getFullText();
        } else {
            List<String> words = simpleBean.getFullTextWords();
            List<String> answer = new LinkedList<String>();
            for (String word : words) {
                if (!exceptWords.contains(word)) answer.add(word);
            }

            return StringUtils.collectionToDelimitedString(answer, " ");
        }
    }

    @Override
    public SubjectFilterTarget getTarget() {
        return simpleBean.getTarget();
    }

    @Override
    public Collection<String> getFilterTags() {
        if (exceptTags == null || exceptTags.isEmpty()) {
            return simpleBean.getFilterTags();
        } else {
            Collection<String> filterTags = simpleBean.getFilterTags();
            List<String> answer = new LinkedList<String>();
            for (String tag : filterTags) {
                if (!exceptTags.contains(tag)) answer.add(tag);
            }
            return answer;
        }
    }

    @Override
    public boolean isFilterFavorite() {
        return simpleBean.isFilterFavorite();
    }
}
